#include<iostream>
#include<vector>
#include <unordered_set>
using namespace std;
/*
给你一个整数数组 nums ，找出并返回所有该数组中不同的递增子序列，递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素，如出现两个整数相等，也可以视作递增序列的一种特殊情况。
解题思路:
该题目做法使用回溯去做的时候需要注意，在递归树枝的时候要判断取的元素不能小于当前path中的末尾元素,还需要考虑去重操作
由于题目给出数据中可能含有相同的元素,当第一个取出一个元素7时，进行回溯之后，后面又取出了一个7，所以就会导致第一个7递归遍历的树枝
会包含后面的7递归遍历的情况，所以要将后面取出来的7舍去，也就是要做到树层上去重，但是该题目和组合2不同无法先进行排序，所以要先
将数层上每次取出的元素放入到set中，然后每次取数要判断se中是否已经包含有该元素.
*/
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int> nums,int index)
{
    if(path.size()>1)
        result.push_back(path);
    //递归终止条件
    if(index>=nums.size())
        return;
    unordered_set<int> uset;
    for(int i=index;i<nums.size();i++)
    {
        //取数时要先判断渠道的该数是否符合要求,即递归时的要求和数层的要求
        if((path.size()>0&&path.back()>nums[i])||uset.find(nums[i])!=uset.end())
            continue;
        uset.insert(nums[i]);
        path.push_back(nums[i]);
        backtracking(nums,i+1);
        path.pop_back();
    }
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
    backtracking(nums,0);
    return result;
}
int main()
{
    cout<<"enter a number:"<<endl;
    int number;
    cin>>number;
    cout<<"enter nums:"<<endl;
    vector<int> nums(number);
    for(int i=0;i<number;i++)
    {
        cin>>nums[i];
    }
    result = findSubsequences(nums);
    for(int i=0;i<result.size();i++)
    {
        for(int j=0;j<result[i].size();j++)
        {
            cout<<result[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}